home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / data / awkscrpt / simz80.awk < prev    next >
Text File  |  1995-02-11  |  13KB  |  749 lines

  1. BEGIN {
  2.     err="/dev/stderr"
  3.     if(ARGC>1) {dbg=ARGV[1];ARGV[1]="-";ARGC=2}
  4.     printf("\nZ80シミュレーションデバッガ") >err
  5.     printf("  SIMZ80\t\t\tBy Jouji\n\n") >err
  6.     em[2]="未登録アドレスを実行しました"
  7.     em[3]="ソースファイルの範囲を越えました"
  8.     em[4]="0番地を実行しました"
  9.     hm[1]="  G:go";hm[2]="R:dump register";hm[3]="ER:enter register"
  10.     hm[4]="P:print number";hm[5]="  T:trace";hm[6]="M:dump memory"
  11.     hm[7]="EM:enter memory";hm[8]="F:read *.dbg file"
  12.     hm[9]="  H:help";hm[10]="L:list";hm[11]="!:system";hm[12]="Q:quit"
  13.     h["0"]=0; h["1"]=1; h["2"]=2; h["3"]=3; h["4"]=4; h["5"]=5; h["6"]=6
  14.     h["7"]=7; h["8"]=8; h["9"]=9; h["A"]=10;h["B"]=11;h["C"]=12;h["D"]=13
  15.     h["E"]=14;h["F"]=15
  16.     FS=",|[ \t]+"
  17.     rb="^[ABCDEHLIR]$"
  18.     rw="^(AF|BC|DE|HL|IX|IY|SP)$"
  19.     rd="^(AF|BC|DE|HL)$"
  20.     rx="^(IX|IY|SP)$"
  21.     bn[0]=1;bn[1]=2;bn[2]=4;bn[3]=8;bn[4]=16;bn[5]=32;bn[6]=64;bn[7]=128
  22.     phl="(HL)";pde="(DE)";psp="(SP)"
  23.     if(dbg) read(dbg)
  24.     printf("Command>") >err
  25. }
  26.  
  27. {$0=toupper($0)}
  28. $1=="T" {
  29.     if(!$2) $2=substr(ad,2)
  30.     ad=adrs("I",$2)
  31.     for(;;) {
  32.         chkad()
  33.         printf("\n%-5s%-18sTrace>",substr(ad,2),d[ad])
  34.         getline
  35.         if($0) break
  36.         exec()
  37.         dspr()
  38.     }
  39. }
  40. $1=="G" {
  41.     if(!$2) $2=substr(ad,2)
  42.     ad=adrs("I",$2)
  43.     if(!$3) $3="0"
  44.     ae=adrs("I",$3)
  45.     printf("\n\n\n")
  46.     while(ad!=ae) {
  47.         chkad()
  48.         printf("\x1b[3A%-5s%-18s\n",substr(ad,2),d[ad])
  49.         exec()
  50.         dspr()
  51.     }
  52. }
  53. $1=="!" {
  54.     sub(/^! +/,"")
  55.     system($0)
  56. }
  57. $1=="ER" {
  58.     for(i=2;i<NF;i+=2) {
  59.         n=hton($(i+1))
  60.         if($i~rb) d[$i]=n%256
  61.         else if($i~rw) storew($i,n)
  62.     }
  63. }
  64. $1=="EM" {
  65.     a=adrs("D",$2)
  66.     for(i=3;i<=NF;i++) {
  67.         d[a]=hton($i)%256
  68.         a=incadr(a)
  69.     }
  70. }
  71. $1=="R" {
  72.     dspr()
  73. }
  74. $1=="F" {
  75.     if(!index($2,".")) $2=$2".DBG"
  76.     read($2)
  77. }
  78. $1=="M" {
  79.     if($2=="") $2="0"
  80.     if($3=="") $3="FFFF"
  81.     sa=adrs("D",$2)
  82.     ea=adrs("D",$3)
  83.     i=0
  84.     for(a in d)
  85.         if(a~/^D....$/) {
  86.             w[++i]=a
  87.             for(j=i;j>1&&w[j-1]>w[j];j--) {
  88.                 t=w[j-1];w[j-1]=w[j];w[j]=t
  89.             }
  90.         }
  91.     for(j=1;j<=i;j++) {
  92.         a=w[j]
  93.         if(a~/^D....$/ && a>=sa && a<=ea)
  94.             printf("%s %02X\n",substr(a,2),d[a])
  95.     }
  96. }
  97. $1=="L" {
  98.     if($2=="") $2="0"
  99.     if($3=="") $3="FFFF"
  100.     sa=adrs("I",$2)
  101.     ea=adrs("I",$3)
  102.     for(i=1;i<=maxl;i++) {
  103.         a=addr[i]
  104.         if(a~/^I....$/ && a>=sa && a<=ea)
  105.             printf("%s %s\n",substr(a,2),d[a])
  106.     }
  107. }
  108. $1=="P" {
  109.     if($2~/H$/) n=hton($2)
  110.     else n=$2+0
  111.     printf("Hex=%04X  Dec=%d\n",n,n)
  112. }
  113. $1=="H" {
  114.     for(i=1;i<13;i++) printf("%-20s",hm[i]) >err
  115. }
  116. $1=="Q" {exit}
  117. {printf("Command>") >err}
  118.  
  119. function read(dbg,  i,f) {
  120.     for(a in d) delete d[a]
  121.     for(a in addr) delete addr[a]
  122.     for(a in line) delete line[a]
  123.     d["A"]=0;d["B"]=0;d["C"]=0;d["D"]=0;d["E"]=0;d["H"]=0;d["L"]=0
  124.     d["F"]=0;d["I"]=0;d["R"]=0;d["IX"]=0;d["IY"]=0;d["SP"]=53248
  125.     while(getline<dbg >0) {
  126.         sub(/ *;.*$/,"")
  127.         if($2~/^I/) {
  128.             d[$2]=substr($0,12)
  129.             if(!f) {f=1;ad=$2}
  130.         }else d[$2]=hton($3)
  131.         addr[++i]=$2
  132.         line[$2]=i
  133.     }
  134.     maxl=i
  135. }
  136.  
  137. function adrs(c,s) {
  138.     s=sprintf("%s%4s",c,s)
  139.     gsub(/ /,"0",s)
  140.     return s
  141. }
  142.  
  143. function chkad() {
  144.     if(ad=="I0000") error(4)
  145.     if(!(ad in d)) error(2)
  146. }
  147.  
  148. function exec(i) {
  149.     fj=0
  150.     no=split(d[ad],x)
  151.     c=x[1];o1=x[2];o2=x[3]
  152.     if(c=="CCF") fc=1-fc
  153.     else if(c=="SCF") fc=1
  154.     else if(c=="CPL") d["A"]=255-d["A"]
  155.     else if(c=="NEG") neg()
  156.     else if(c=="JP") jp(o1,o2)
  157.     else if(c=="JR") jr(o1,o2)
  158.     else if(c=="CALL") call(o1,o2)
  159.     else if(c=="RET") ret(o1)
  160.     else if(c=="DJNZ") {if(--d["B"]) jrs(o1)}
  161.     else if(c=="AND") and(o1)
  162.     else if(c=="XOR") xor(o1)
  163.     else if(c=="OR") or(o1)
  164.     else if(c=="CP") cp(o1)
  165.     else if(c=="INC") inc(o1)
  166.     else if(c=="DEC") dec(o1)
  167.     else if(c=="LD") ld(o1,o2)
  168.     else if(c=="EX") ex(o1,o2)
  169.     else if(c=="PUSH") push(o1)
  170.     else if(c=="POP") pop(o1)
  171.     else if(c=="LDI") ldi()
  172.     else if(c=="LDIR") ldir()
  173.     else if(c=="LDD") ldd()
  174.     else if(c=="LDDR") lddr()
  175.     else if(c=="CPI") cpi()
  176.     else if(c=="CPIR") cpir()
  177.     else if(c=="CPD") cpd()
  178.     else if(c=="CPDR") cpdr()
  179.     else if(c=="ADD") add(o1,o2)
  180.     else if(c=="ADC") adc(o1,o2)
  181.     else if(c=="SUB") sba(o1)
  182.     else if(c=="SBC") sbc(o1,o2)
  183.     else if(c=="RLCA") rlca()
  184.     else if(c=="RLA") rla()
  185.     else if(c=="RRCA") rrca()
  186.     else if(c=="RRA") rra()
  187.     else if(c=="RLD") rld()
  188.     else if(c=="RRD") rrd()
  189.     else if(c=="RLC") rlc(o1)
  190.     else if(c=="RL") rl(o1)
  191.     else if(c=="RRC") rrc(o1)
  192.     else if(c=="RR") rr(o1)
  193.     else if(c=="SLA") sla(o1)
  194.     else if(c=="SRA") sra(o1)
  195.     else if(c=="SRL") srl(o1)
  196.     else if(c=="BIT") bit(o1,o2)
  197.     else if(c=="SET") set(o1,o2)
  198.     else if(c=="RES") res(o1,o2)
  199.     if(fj) return
  200.     l=line[ad]+1
  201.     if(!(l in addr)) error(3)
  202.     ad=addr[l]
  203. }
  204.  
  205. function jp(o1,o2) {
  206.     if(no==3) {
  207.         if((o1=="NZ"&&fz)||(o1=="Z"&&!fz)||(o1=="NC"&&fc)||
  208.             (o1=="C"&&!fc)||(o1=="P"&&fs)||(o1=="M"&&!fs)||
  209.             (o1=="PO"&&fp)||(o1=="PE"&&!fp)) return
  210.         o1=o2
  211.     }
  212.     if(o1~/^\(/) o1=hexadr(o1)
  213.     ad="I" o1
  214.     fj=1
  215. }
  216.  
  217. function jr(o1,o2) {
  218.     if(no==2) jrs(o1)
  219.     else if((o1=="NZ"&&!fz)||(o1=="Z"&&fz)||
  220.             (o1=="NC"&&!fc)||(o1=="C"&&fc)) jrs(o2)
  221. }
  222.  
  223. function jrs(opr,  e,a) {
  224.     fj=1
  225.     if(opr~/^@/)
  226.         ad="I" substr(opr,2)
  227.     else {
  228.         e=hton(opr); e=(e>127)?e-256:e
  229.         a=hton(substr(ad,2))+e+2
  230.         ad=sprintf("I%04X",a)
  231.     }
  232. }
  233.  
  234. function call(o1,o2,  i) {
  235.     if(no==3) {
  236.         if((o1=="NZ"&&fz)||(o1=="Z"&&!fz)||(o1=="NC"&&fc)||
  237.             (o1=="C"&&!fc)||(o1=="P"&&fs)||(o1=="M"&&!fs)||
  238.             (o1=="PO"&&fp)||(o1=="PE"&&!fp)) return
  239.         o1=o2
  240.     }
  241.     i=hton(substr(ad,2))+3
  242.     d["SP"]-=2
  243.     storew(psp,i)
  244.     ad="I" o1
  245.     fj=1
  246. }
  247.  
  248. function ret(opr,  i) {
  249.     if((no==2)&&((opr=="NZ"&&fz)||(opr=="Z"&&!fz)||(opr=="NC"&&fc)||
  250.         (opr=="C"&&!fc)||(opr=="P"&&fs)||(opr=="M"&&!fs)||
  251.         (opr=="PO"&&fp)||(opr=="PE"&&!fp))) return
  252.     i=evalw(psp)
  253.     d["SP"]+=2
  254.     ad=sprintf("I%04X",i)
  255.     fj=1
  256. }
  257.  
  258. function ld(o1,o2,  v) {
  259.     if(o1~rw||o2~rw) {
  260.         v=evalw(o2)
  261.         storew(o1,v)
  262.     }else {
  263.         v=evalb(o2)
  264.         storeb(o1,v)
  265.     }
  266. }
  267.  
  268. function ex(o1,o2,  i,j) {
  269.     i=evalw(o2)
  270.     j=evalw(o1)
  271.     storew(o1,i)
  272.     storew(o2,j)
  273. }
  274.  
  275. function push(opr,  i) {
  276.     i=evalw(opr)
  277.     d["SP"]-=2
  278.     storew(psp,i)
  279. }
  280.  
  281. function pop(opr,  i) {
  282.     i=evalw(psp)
  283.     d["SP"]+=2
  284.     storew(opr,i)
  285. }
  286.  
  287. function ldi(n) {
  288.     n=evalb(phl)
  289.     storeb(pde,n)
  290.     inc("HL")
  291.     inc("DE")
  292.     dec("BC")
  293.     fp=(evalw("BC"))?1:0
  294. }
  295.  
  296. function ldir(i,j,n) {
  297.     j=evalw("BC")
  298.     if(j==0) j=65536
  299.     for(i=j;i>0;i--) {
  300.         n=evalb(phl)
  301.         storeb(pde,n)
  302.         inc("HL")
  303.         inc("DE")
  304.     }
  305.     d["B"]=0
  306.     d["C"]=0
  307. }
  308.  
  309. function ldd(i,n) {
  310.     n=evalb(phl)
  311.     storeb(pde,n)
  312.     dec("HL")
  313.     dec("DE")
  314.     dec("BC")
  315.     fp=(evalw("BC"))?1:0
  316. }
  317.  
  318. function lddr(i,j,n) {
  319.     j=evalw("BC")
  320.     if(j==0) j=65536
  321.     for(i=j;i>0;i--) {
  322.         n=evalb(phl)
  323.         storeb(pde,n)
  324.         dec("HL")
  325.         dec("DE")
  326.     }
  327.     d["B"]=0
  328.     d["C"]=0
  329. }
  330.  
  331. function cpi(i) {
  332.     i=d["A"]-evalb(phl)
  333.     fz=!i
  334.     fs=(i>127)
  335.     inc("HL")
  336.     dec("BC")
  337.     fp=(evalw("BC"))?1:0
  338. }
  339.  
  340. function cpir(i) {
  341.     do {
  342.         i=d["A"]-evalb(phl)
  343.         fz=!i
  344.         fs=(i>127)
  345.         inc("HL")
  346.         dec("BC")
  347.         fp=(evalw("BC"))?1:0
  348.     } while(!fz&&fp)
  349. }
  350.  
  351. function cpd(i) {
  352.     i=d["A"]-evalb(phl)
  353.     fz=!i
  354.     fs=(i>127)
  355.     dec("HL")
  356.     dec("BC")
  357.     fp=(evalw("BC"))?1:0
  358. }
  359.  
  360. function cpdr(i) {
  361.     do {
  362.         i=d["A"]-evalb(phl)
  363.         fz=!i
  364.         fs=(i>127)
  365.         dec("HL")
  366.         dec("BC")
  367.         fp=(evalw("BC"))?1:0
  368.     } while(!fz&&fp)
  369. }
  370.  
  371. function add(o1,o2,  i,v) {
  372.     if(o1=="A") {
  373.         i=d["A"]+evalb(o2)
  374.         if(i>255) {fc=1;i-=256} else fc=0
  375.         d["A"]=i
  376.         fz=!i
  377.         fs=(i>127)
  378.     }else {
  379.         i=evalw(o1)+evalw(o2)
  380.         if(i>65535) {fc=1;i-=65536} else fc=0
  381.         storew(o1,i)
  382.     }
  383. }
  384.  
  385. function adc(o1,o2,  i,v) {
  386.     if(o1=="A") {
  387.         i=d["A"]+evalb(o2)+fc
  388.         if(i>255) {fc=1;i-=256} else fc=0
  389.         d["A"]=i
  390.         fs=(i>127)
  391.     }else {
  392.         i=256*d["H"]+d["L"]+evalw(o2)+fc
  393.         if(i>65535) {fc=1;i-=65536} else fc=0
  394.         d["H"]=int(i/256)
  395.         d["L"]=i%256
  396.         fs=(i>32767)
  397.     }
  398.     fz=!i
  399. }
  400.  
  401. function cp(opr,  i) {
  402.     i=d["A"]-evalb(opr)
  403.     if(i<0) {fc=1;i+=256} else fc=0
  404.     fz=!i
  405.     fs=(i>127)
  406. }
  407.  
  408. function sba(opr,  i) {
  409.     i=d["A"]-evalb(opr)
  410.     if(i<0) {fc=1;i+=256} else fc=0
  411.     d["A"]=i
  412.     fz=!i
  413.     fs=(i>127)
  414. }
  415.  
  416. function sbc(o1,o2,  i,v) {
  417.     if(o1=="A") {
  418.         i=d["A"]-evalb(o2)-fc
  419.         if(i<0) {fc=1;i+=256} else fc=0
  420.         d["A"]=i
  421.         fs=(i>127)
  422.     }else {
  423.         i=256*d["H"]+d["L"]-evalw(o2)-fc
  424.         if(i<0) {fc=1;i+=65536} else fc=0
  425.         d["H"]=int(i/256)
  426.         d["L"]=i%256
  427.         fs=(i>32767)
  428.     }
  429.     fz=!i
  430. }
  431.  
  432. function neg(i) {
  433.     i=256-d["A"]
  434.     if(i==256) {i-=256;fc=1} else fc=0
  435.     fz=!i
  436.     fs=(i>127)
  437.     d["A"]=i
  438. }
  439.  
  440. function and(opr,  i,m,n) {
  441.     n=evalb(opr)
  442.     m=d["A"]
  443.     d["A"]=i=andv(m,n)
  444.     fc=0
  445.     fz=!i
  446.     fs=(i>127)
  447. }
  448.  
  449. function xor(opr,  i) {
  450.     n=evalb(opr)
  451.     m=d["A"]
  452.     d["A"]=i=m+n-2*andv(m,n)
  453.     fc=0
  454.     fz=!i
  455.     fs=(i>127)
  456. }
  457.  
  458. function or(opr,  i) {
  459.     n=evalb(opr)
  460.     m=d["A"]
  461.     d["A"]=i=m+n-andv(m,n)
  462.     fc=0
  463.     fz=!i
  464.     fs=(i>127)
  465. }
  466.  
  467. function andv(m,n,  i,j,f) {
  468.     for(i=7;i>=0;i--) {
  469.         f=0
  470.         if(m>=bn[i]) {m-=bn[i];f=1}
  471.         if(n>=bn[i]) {n-=bn[i];if(f)j+=bn[i]}
  472.     }
  473.     return j
  474. }
  475.  
  476. function inc(opr,  i) {
  477.     if(opr~rw) {
  478.         i=evalw(opr)+1
  479.         if(i>65535) i-=65536
  480.         storew(opr,i)
  481.     }else {
  482.         i=evalb(opr)+1
  483.         if(i>255) i-=256
  484.         storeb(opr,i)
  485.         fz=!i
  486.         fs=(i>127)
  487.     }
  488. }
  489.  
  490. function dec(opr,  i) {
  491.     if(opr~rw) {
  492.         i=evalw(opr)-1
  493.         if(i<0) i+=65536
  494.         storew(opr,i)
  495.     }else {
  496.         i=evalb(opr)-1
  497.         if(i<0) i+=256
  498.         storeb(opr,i)
  499.         fz=!i
  500.         fs=(i>127)
  501.     }
  502. }
  503.  
  504. function rlca(i) {
  505.     i=2*d["A"]
  506.     if(i>255) {i-=255;fc=1}
  507.     else fc=0
  508.     d["A"]=i
  509. }
  510.  
  511. function rla(i) {
  512.     i=2*d["A"]+fc
  513.     if(i>255) {i-=256;fc=1}
  514.     else fc=0
  515.     d["A"]=i
  516. }
  517.  
  518. function rrca(i,j) {
  519.     i=d["A"]
  520.     j=i%2
  521.     i=int(i/2)+128*j
  522.     fc=j
  523.     d["A"]=i
  524. }
  525.  
  526. function rra(i,j) {
  527.     i=d["A"]
  528.     j=i%2
  529.     i=int(i/2)+128*fc
  530.     fc=j
  531.     d["A"]=i
  532. }
  533.  
  534. function rld(i,j,k,n,m) {
  535.     i=int(d["A"]/16)
  536.     j=d["A"]%16
  537.     k=evalb(phl)
  538.     m=int(k/16)
  539.     n=k%16
  540.     d["A"]=16*i+m
  541.     k=16*n+j
  542.     storeb(phl,k)
  543.     fz=!k
  544.     fs=(k>127)
  545. }
  546.  
  547. function rrd(i,j,k,n,m) {
  548.     i=int(d["A"]/16)
  549.     j=d["A"]%16
  550.     k=evalb(phl)
  551.     m=int(k/16)
  552.     n=k%16
  553.     d["A"]=16*i+n
  554.     k=16*j+m
  555.     storeb(phl,k)
  556.     fz=!k
  557.     fs=(k>127)
  558. }
  559.  
  560. function rlc(opr,  i) {
  561.     i=2*evalb(opr)
  562.     if(i>255) {i-=255;fc=1}
  563.     else fc=0
  564.     storeb(opr,i)
  565.     fz=!i
  566.     fs=(i>127)
  567. }
  568.  
  569. function rl(opr,  i) {
  570.     i=2*evalb(opr)+fc
  571.     if(i>255) {i-=256;fc=1}
  572.     else fc=0
  573.     storeb(opr,i)
  574.     fz=!i
  575.     fs=(i>127)
  576. }
  577.  
  578. function rrc(opr,  i,j) {
  579.     i=evalb(opr)
  580.     j=i%2
  581.     i=int(i/2)+128*j
  582.     fc=j
  583.     storeb(opr,i)
  584.     fz=!i
  585.     fs=(i>127)
  586. }
  587.  
  588. function rr(opr,  i,j) {
  589.     i=evalb(opr)
  590.     j=i%2
  591.     i=int(i/2)+128*fc
  592.     fc=j
  593.     storeb(opr,i)
  594.     fz=!i
  595.     fs=(i>127)
  596. }
  597.  
  598. function sla(opr,  i) {
  599.     i=2*evalb(opr)
  600.     if(i>255) {i-=256;fc=1}
  601.     storeb(opr,i)
  602.     fz=!i
  603.     fs=(i>127)
  604. }
  605.  
  606. function sra(opr,  i,j) {
  607.     i=evalb(opr)
  608.     if(i>127) j=128
  609.     fc=i%2
  610.     i=int(i/256)+j
  611.     storeb(opr,i)
  612.     fz=!i
  613.     fs=(i>127)
  614. }
  615.  
  616. function srl(opr,  i) {
  617.     i=evalb(opr)
  618.     fc=i%2
  619.     i=int(i/256)
  620.     storeb(opr,i)
  621.     fz=!i
  622.     fs=(i>127)
  623. }
  624.  
  625. function bit(o1,o2) {
  626.     byte2bit(o2)
  627.     fz=bt[o1]
  628. }
  629.  
  630. function set(o1,o2) {
  631.     byte2bit(o2)
  632.     bt[o1]=1
  633.     storeb(o2,bit2byte())
  634. }
  635.  
  636. function res(o1,o2) {
  637.     byte2bit(o2)
  638.     bt[o1]=0
  639.     storeb(o2,bit2byte())
  640. }
  641.  
  642. function bit2byte(n,i) {
  643.     for(i=0;i<8;i++) {if(bt[i]) n+=bn[i]}
  644.     return n
  645. }
  646.  
  647. function byte2bit(opr,  n,i) {
  648.     n=evalb(opr)
  649.     for(i=7;i>=0;i--)
  650.         if(n>=bn[i]) {bt[i]=1;n-=bn[i]} else bt[i]=0
  651. }
  652.  
  653. function evalb(opr,  a) {
  654.     if(opr~rb) return d[opr]
  655.     if(opr~/^\(/) {
  656.         a="D" hexadr(opr)
  657.         return d[a]
  658.     }
  659.     return hton(opr)
  660. }
  661.  
  662. function evalw(opr,  a,b) {
  663.     if(opr~rd) {
  664.         a=substr(opr,2)
  665.         b=substr(opr,1,1)
  666.         return 256*d[b]+d[a]
  667.     }
  668.     if(opr~rx) return d[opr]
  669.     if(opr~/^\(/) {
  670.         a="D" hexadr(opr)
  671.         b=incadr(a)
  672.         return 256*d[b]+d[a]
  673.     }
  674.     return hton(opr)
  675. }
  676.  
  677. function storeb(opr,i,  a) {
  678.     if(opr~rb) a=opr
  679.     else a="D" hexadr(opr)
  680.     d[a]=i
  681. }
  682.  
  683. function storew(opr,v,  h,l,a,b) {
  684.     if(opr~rx) d[opr]=v
  685.     else if(opr~rd) {
  686.         h=substr(opr,1,1)
  687.         l=substr(opr,2)
  688.         d[h]=int(v/256)
  689.         d[l]=v%256
  690.     }else {
  691.         a="D" hexadr(opr)
  692.         b=incadr(a)
  693.         d[a]=v%256
  694.         d[b]=int(v/256)
  695.     }
  696. }
  697.  
  698. function hexadr(opr,  h,l,i,j) {
  699.     opr=substr(opr,2)
  700.     sub(/.$/,"",opr)
  701.     if(opr~rd) {
  702.         h=substr(opr,1,1)
  703.         l=substr(opr,2)
  704.         return sprintf("%02X%02X",d[h],d[l])
  705.     }
  706.     if(opr~/^SP/) return sprintf("%04X",d["SP"])
  707.     if(opr~/^I[XY]/) {
  708.         h=substr(opr,1,2)
  709.         l=substr(opr,3)
  710.         j=hton(l)
  711.         if(j>127) j=j-256
  712.         i=d[h]+j
  713.         if(i<0) i+=65536
  714.         if(i>65535) i-=65536
  715.         return sprintf("%04X",i)
  716.     }
  717.     return opr
  718. }
  719.  
  720. function incadr(a,  c,i) {
  721.     c=substr(a,1,1)
  722.     i=hton(substr(a,2))+1
  723.     if(i>65535) i-=65535
  724.     return sprintf("%s%04X",c,i)
  725. }
  726.  
  727. function dspr() {
  728.     printf("A=%02X  BC=%02X%02X  DE=%02X%02X  HL=%02X%02X\n",
  729.             d["A"],d["B"],d["C"],d["D"],d["E"],d["H"],d["L"])
  730.     printf("F=??  IX=%04X  IY=%04X  SP=%04X  CF=%d  ZF=%d  SF=%d\n",
  731.             d["IX"],d["IY"],d["SP"],fc,fz,fs)
  732. }
  733.  
  734. function hton(s,  i,m,n,c) {
  735.     m=length(s)
  736.     for(i=1;i<=m;i++) {
  737.         c=substr(s,i,1)
  738.         if(c!~/[0-9A-F]/) break
  739.         n=16*n+h[c]
  740.     }
  741.     return n
  742. }
  743.  
  744. function error(n) {
  745.     print em[n] >err
  746.     printf("Command>") >err
  747.     next
  748. }
  749.